OE4DOS 2021/2022 - Drugi domaći zadatak

Aleksa Cvetanović 2018/0160

Zadatak 1

U prvom zadatku potrebno je izvršiti postupak inverznog polutoniranja, odnosno restauraciju slike half_tone.jpg nastale postupkom polutoniranja.

Frekvencijski domen

Obradu ove slike najlakše je izvršiti u frekvencijskom domenu, primenom brze Furijeove transformacije, koja sliku iz prostornog domena slika u frekvencijski. Brza Furijeova transformacija 2D signala je optimizovani algoritam koji vrši izračunavanje diskretne Furijeove transformacije 2D signala, matematički predstavljene formulom:

$$F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi(\frac{ux}{M}+\frac{vy}{N})}$$

gde su:

Ova operacija izvršena je nad slikom half_tone.jpg primenom funkcije fft2(). Takođe, da bi se rezultati mogli prikazati u opsegu $[-\frac{N}{2}, \frac{N}{2}-1]$ i $[-\frac{M}{2}, \frac{M}{2}-1]$ potrebno je izvršiti centriranje spektra, što je urađeno pomoću funkcije fftshift(). Nakon obrade slike u frekvencijskom domenu, pomoću funkcija ifftshift() i ifft2() prelazi se iz frekvencijskog u prostorni domen. Tada je zbog grešaka prilikom zaokruživanja u računaru moguća pojava malih imaginarnih delova u vrednostima piksela, pa je potrebno otkloniti ih primenom funkcije real(). Na taj način dobija se slika čije su sve vrednosti realne, u skladu sa realnim signalima.

Filtriranje u frekvencijskom domenu

Za obradu ove slike korišćeni su sledeći filtri:

Filtriranje se u frekvencijskom domenu svodi na množenje spektra slike spektrom filtra, što ga čini mnogo jednostavnijim nego u prostornom domenu. U daljem tekstu biće prikazan uticaj svakog filtra na spektar, kao i na konačan rezultat.

U sledećem segmentu koda izvršeno je učitavanje potrebnih Python modula, i definisane su razne pomoćne funkcije koje će u daljem kodu biti korišćene za rešavanje zadatka. Na kraju, izvršeno je učitavanje ulazne slike, transformacija u frekvencijski domen, i prikazana je amplitudska karakteristika slike. Zbog velikih razlika u intenzitetima spektralnih komponenti amplitudske karakteristike slike, ona je prikazana na logaritamskoj skali.

Gausov filtar

Gausov filtar u prostornom i frekvencijskom domenu imaju isti oblik. Parametar $sigma$ u ovom slučaju treba podesiti tako da se otklone visoke učestanosti, čime se eliminiše šum, ali i lokalni maksimumi vidljivi na grafiku Furijeove transformacije.

U sledećem delu koda izvršeno je usrednjavanje Gausovim filtrom u frekvencijskom domenu svake ravni slike, i prikazani su rezultati u frekvencijskom, kao i u prostornom domenu.

Sa slika Furijeovih transformacija ravni se vidi da ovaj filtar uklanja većinu lokalnih maksimuma u frekvencijskom domenu, što dovodi do lepo raspoređenih boja na slici. Međutim, filtar uklanja i željene komponente koje predstavljaju detalje, pa je zbog toga slika na izlazu veoma mutna, gotovo bez ikakvih ivica i samo sa naznakama onoga što se na njoj nalazi. Za bolje rezultate neophodno je primeniti drugačiji pristup.

Notch filtar

Drugi pristup rešavanju ovog zadatka jeste primena Gausovog filtra koji ima veću vrednost parametra $sigma$, ali i Gausovog notch filtra. Notch filtri su tipovi filtara koji imaju pomerene koordinate centra - predstavljaju Band Pass ili Band Reject tipove filtara. Za rešavanje ovog zadatka korišćeni su Band Reject Notch filtri, čiji se centri poklapaju sa lokalnim maksimumima logaritma amplitudske karakteristike slike. Sama vrsta filtra može biti bilo koja (idealni, Gausov, Butterworth, ...) - zbog malog nepropusnog opsega razlike u dobijenim rezultatima nisu velike. Za rešavanje ovog zadatka korišćen je Gausov Notch filtar. Takođe, potrebno je koristiti i standardni Gausov filtar koji potiskuje visoke učestanosti, čime potiskuje šum.

Prilikom koriščenja Notch filtara neophodno je odrediti lokalne maksimume amplitudske karakteristike, čije će koordinate predstavljati centre filtara. Zbog naglog smanjenja vrednosti sa porastom učestanosti, za ovaj algoritam koriščen je logaritam amplitudske karakteristike. Takođe, prag sa kojim se frekvencijske komponente porede smanjuje se sa porastom učestanosti, odnosno udaljenosti od DC vrednosti, u skladu sa osobinama signala u spektru. Ovakav algoritam daje adekvatne rezultate, što će kasnije biti prikazano.

Sledeći deo koda realizuje propuštanje svih ravni slike kroz Gausov i Gausov Band Reject Notch filtar. Takođe, prikazuje rezultate u frekvencijskom domenu po ravnima, i konačan rezultat filtriranja.

Na prikazu Furijeove transformacije se vidi da su potisnute sve spektralne komponente na kojima su bili uočljivi lokalni maksimumi. To je dovelo do potiskivanja periodičnih smetnji na slici, odnosno razlivanja boja na željenim mestima. Na samoj slici se vidi vidno poboljšanje u količini detalja u odnosu na prethodni pristup. Međutim, smetnje su još uvek vidljive, pa je potrebno primeniti još jedan filtar kako bi se one dodatno potisnule.

Idealni filtar nepropusnik opsega učestanosti

Na prethodnom prikazu Furijeove transformacije slike uočljiv je u sve tri ravni kvadratni oblik u kome su vrednosti logaritma amplitudske karakteristike veće u odnosu na okolinu. Ovaj oblik biće uklonjen primenom idealnog filtra nepropusnika opsega učestanosti oblika kvadrata. Idealni filtar je izabran pre svega zbog toga što se može definisati tako da odgovara kvadratnom obliku kakav je potreban za otklanjanje.

U sledećem segmentu koda primenjen je ovaj filtar na dosadašnji rezultat i prikazani su rezultati u frekvencijskom i u prostornom domenu.

Prikaz Furijeove transformacije pokazuje da su spektralne komponente u željenom području u potpunosti uklonjene. Parametri filtara izabrani su upravo tako da filtar obuhvata željeno područje. Na slici se vidi vidno poboljšanje u smislu potiskivanja neželjenih periodičnih smetnji. Ovim je završen postupak inverznog polutoniranja.

Sledeći deo koda iscrtava poređenje originalne slike i slike nakon svakog koraka obrade.

Uporednim prikazom rezultata jasno se vidi razlog koriščenja Notch i idealnog Band Reject filtra. Konačna slika još uvek nema u potpunosti jasno izražene detalje, ali je dovoljna za jasno prepoznavanje objekata koji se na njoj nalaze. Ovim zadatkom pokazan je značaj primenjenih filtara, kao i jednostavnost filtriranja u frekvencijskom domenu.

Zadatak 2

U drugom zadatku potrebno je izvršiti restauraciju slike etf_blur.tif sa zamućenjem usled pokreta, na osnovu poznatog pokreta kamere datog na slici kernel.tif. Potrebno je obratiti pažnju na to da proces zamućenja ne menja srednju vrednost intenziteta slike.

Degradacija usled pokreta

Degradaciju usled pokreta neophodno je posmatrati kao linearnu, prostorno invarijantnu degradaciju. Na osnovu toga model sistema koji na svom izlazu daje degradiranu sliku može se predstaviti na sledeći način:

$$g(x,y)=f(x,y)*h(x,y)+\eta(x,y)$$

gde je:

Prilikom rešavanja ovog zadatka pretpostavlja se da nema aditivnog šuma koji se dodaje na rezultat konvolucije, odnosno $\eta(x,y)=0$. U tom slučaju slika pre degradacije se može dobiti kao rezultat dekonvolucije degradirane slike i impulsnog odziva degradacije. Dekonvoluciju je mnogo jednostavnije izvršiti u frekvencijskom domenu, jer se tada ona slika u deljenje. Zbog toga je pre svega potrebno izraziti sliku i degradaciju u spektralnom domenu.

Spektar slike i degradacije

Predstavljanje slike u frekvencijskom domenu, kao i funkcije korišćene za njeno određivanje, objašnjeni su u prethodnom zadatku. Isti princip važi za sliku i degradaciju u ovom zadatku, s tim što u ovom slučaju treba obratiti pažnju na broj tačaka u kojima se računa brza Furijeova transformacija degradacije. Kako bi operacija dekonvolucije bila adekvatno izvedena, potrebno je da FFT slike i degradacije budu izračunate u istom broju tačaka.

U sledećem segmentu koda definisane su pomoćne funkcije korišćene kasnije. Dalje, učitane su reprezentacije degradirane slike i degradacije u prostornom domenu. Na kraju, izvršene su brze Furijeove transformacije degradirane slike i degradacije, centriranje njihovih spektara i prikazane su njihove amplitudske karakteristike. Zbog velikih razlika intenziteta različitih spektralnih komponenti amplitudske karakteristike prikazane su na logaritamskoj skali.

Poređenjem se mogu uočiti slični šabloni koji se javljaju na amplitudskim spektrima degradirane slike i degradacije. To pokazuje da spektar degradirane slike predstavlja proizvod originalne slike i spektra degradacije. Takođe, može se primetiti da su spektri centralno simetrični, što je odlika realnih signala.

Dekonvolucija

Da bi se došlo do originalne slike, potrebno je izvršiti dekonvoluciju degradirane slike i degradacije. Ovu operaciju je mnogo lakše izvesti u spektralnom domenu, zato što se svodi na deljenje spektara degradirane slike i degradacije.

Održavanje srednje vrednosti intenziteta slike

Informacija o srednjoj vrednosti intenziteta slike sadržana je u DC komponenti spektra slike. Da bi se ona održala, potrebno je skalirati FFT degradacije tako da njegova DC komponenta bude jednaka 1. Na taj način pilikom deljenja FFT slike i degradacije ne dolazi do promene DC komponente slike, čime se čuva njena originalna srednja vrednost.

U sledećem delu koda izvršeno je skaliranje FFT degradacije tako da se procesom dekonvolucije u spektru ne menja DC komponenta slike. Dalje, izvršena je dekonvolucija deljenjem spektara degradirane slike i degradacije, čime je dobijen spektar originalne slike. Prikazan je amplitudski spektar rezultata dekonvolucije na logaritamskoj skali.

Dobijeni rezultat bi u idealnom slučaju trebalo da predstavlja spektar originalne slike. Međutim, sa rezultata se mogu primetiti spektralne komponente na visokim učestanostima koje nose veliki procenat energije. U realnom svetu najveći procenat energije nose spektralne komponente bliske nultoj učestanosti, pa je zbog toga na rezultat dekonvolucije potrebno primeniti NF filtar.

Niskofrekventno filtriranje

Niskofrekventnim filtriranjem potiskuju se komponente na visokim učestanostima, a propuštaju komponente na niskim učestanostima. Na taj način ne dozvoljavaju se brze promene vrednosti intenziteta piksela, koje predstavljaju detalje ili šum. U ovom zadatku potrebno je odrediti tip NF filtra koji sa jedne strane dovoljno potiskuje komponente na visokim učestanostima tako da nema neželjenih promena intenziteta piksela na slici, a sa druge strane dovoljno propušta komponente na niskim učestanostima tako da ne poništi rezultate dekonvolucije.

Evidentno je da će primena idelanog filtra dosta pogoršati rezultat dekonvolucije, zato što potpuno potiskuje sve komponente van određenog opsega učestanosti. Visoke učestanosti koje umanjuju zamućenje usled pokreta moraju se potisnuti, ali se ne bi smele u potpunosti ukloniti. Zbog toga će mnogo bolje rezultate dati Gausov ili Butterworth-ov filtar, koji ne uklanjaju u potpunosti ove spektralne komponente.

Prilikom filtriranja treba obratiti pažnju na to da ne dolazi do promene vrednosti DC komponente slike. Na taj način se održava srednja vrednost intenziteta slike, kao što je naglašeno u zadatku.

Sledeći deo koda predstavlja primenu Gausovog i Butterworth filtra sa različitim parametrima na rezultat dekonvolucije. Za različite parametre ovih filtara prikazani su rezultati filtriranja.

Rezultati pokazuju vidno potiskivanje signala dalje od centra, odnosno na višim učestanostima, kao što je i očekivano. Takođe, vidi se da za vrednost $sigma=200$ potiskivanje nije veliko, što znači da u prostornom domenu rezultati verovatno neće biti adekvatni. Za oba Butterworth filtra korišćen je filtar drugog reda, jer sa povećanjem reda ovog filtra on sve više liči na idealni.

Vraćanje u prostorni domen

Nakon izvršenih operacija nad spektralnim domenom potrebno je vratiti se u prostorni domen primenom inverzne diskretne Furijeove transformacije 2D signala, definisane formulom:

$$f(x,y)=\frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{j2\pi(\frac{ux}{M}+\frac{vy}{N})}$$

U Python-u ovaj postupak je definisan u funkciji ifft2(). Naravno, zbog centriranja spektra koje je izvršeno ranije, pre inverzne brze Furijeove transformacije neophodno je vratiti spektar prrimenom funkcije ifftshift(). Na kraju, potrebno je odseći imaginarne delove koji su se pojavili zbog grešaka prilikom zaokruživanja u računaru, primenom funkcije real().

U sledećem segmentu koda izvršeno je vraćanje obrađene slike u prostorni domen. Prikazani su rezultati dobijeni primenom različitih NF filtara na rezultat dekonvolucije.

Kao što je i pretpostavljano, vidi se da za vrednost $sigma=200$ postoje neželjene visoke učestanosti koje nijedan tip filtra nije uspešno otklonio. Sa druge strane, filtri sa $sigma=50$ previše potiskuju visoke učestanosti, čime umanjuju efekat dekonvolucije i vraćaju još uvek zamućenu sliku. Zaključak je da je adekvatna vrednost $sigma$ negde između ove dve vrednosti. Takođe, sa rezultata za $sigma=200$ vidi se da Gausov filtar daje oštriju sliku, što znači da on bolje čuva željeni rezultat dekonvolucije.

Sledeći deo koda filtrira rezultat dekonvolucije Gausovim filtrom sa parametrom $sigma=130$, za koji se dobijaju zadovoljavajući rezultati. Dalje, vraća sliku u prostorni domen i prikazuje poređenje degradirane slike i rezultata. Treba naglasiti da zbog skaliranja FFT degradacije i pažljivo definisanih filtara nije potrebno dodatno razvlačenje kontrasta, jer se srednja vrednost intenziteta slika održala konstantnom.

Poređenjem degradirane i obrađene slike vidi se značajno poboljšanje. Zamućenje usled šuma je gotovo u potpunosti otklonjeno, i jasno se vide svi detalji. Nažalost, tokom ovog procesa uveden je šum koji se manifestuje neželjenim artefaktima na slici. Ovaj šum je moguće umanjiti dodatnim filtriranjem, ali i sa njim slika je znatno bolja od prvobitne, degradirane slike.

Zadatak 3

U trećem zadatku potrebno je proceniti varijansu šuma na slici lena_noise.tif i potisnuti ga korišćenjem adaptivnog filtriranja.

Procena varijanse šuma

Varijansa šuma procenjuje se na osnovu histograma lokalnih varijansi slike. Varijansa u lokalnom susedstvu može se odrediti kao razlika srednje vrednosti kvadrata piksela tog susedstva i kvadrata srednje vrednosti ovih piksela. Nakon toga formira se histogram varijansi svih lokalnih susedstva, i za varijansu šuma se bira vrednost koja ima maksimalnu visinu na histogramu. Razlog tome jeste uvedena pretpostavka da u svakom lokalnom susedstvu većina piksela pripada unifomnim regionima slike. Ako svi pikseli susedstva potiču od istog izvora, razlika u njihovim intenzitetima biće posledica samo Gausovog šuma. Na osnovu toga smatra se da varijansa lokalnog susedstva predstavlja varijansu šuma. Ova pretpostavka nije u potpunosti tačna, pa zbog toga različita lokalna susedstva imaju različite varijanse. Formiranjem histograma lokalnih varijansi može se odrediti varijansa lokalnog susedstva koju ima najveći broj susedstva, i ona se smatra za varijansu šuma.

U sledećem segmentu koda za opseg vrednosti radijusa lokalnog susedstva $r=[1,20]$ određene su varijanse lokalnih susedstva, formirani su histogrami lokalnih varijansi i na osnovu njih odabrane su vrednosti varijansi šuma. Prikazani su rezultati u zavisnosti od vrednosti radijusa $r$, kao i histogrami lokalnih varijansi za neke vrednosti radijusa $r$.

Sa histograma i grafika iznad lako se uočava da su za različite vrednosti radijusa $r$ dobijene veoma slične procene varijanse šuma. Razlike koje postoje nastale su iz sledećih razloga:

Takođe, povećanjem radijusa se iz istih razloga povećava i procenjena varijansa lokalnih susedstva. Zbog toga veći broj susedstva ima veću varijansu od šuma, pa veći broj elemenata matrice težina korišćene za adaptivno filtriranje ima vrednost blisku nuli. Efektivno, detektovani detalji postaju mnogo "deblji" od pravih, odnosno ivice koje treba očuvati na matrici težina postaju prevelike. Kao posledica javlja se vidljiv prostor oko svake ivice u kome šum nije adekvatno otklonjen.

Navedeni razlozi dovode do zaključka da dimenzije lokalnih susedstva ne treba da budu ni premale ni prevelike. Zbog toga je za optimalni radijus izabrana vrednost $r=6$, koja daje estimiranu vrednost varijanse šuma $\sigma_n^2=0.0.0072$. Iako ova procena verovatno nije najbliža pravoj varijansi šuma, dovoljno je bliska njoj da rezultati budu zadovoljavajući. Sa druge strane, dodatno povećanje radijusa $r$ narušava kvalitet slike u delovima gde postoje ivice, što postaje veći problem od tačne procene varijanse šuma.

Sledeći segment koda ponavlja izračunavanja za vrednost radijusa $r=6$.

Adaptivno filtriranje šuma

Za otklanjanje šuma korišćen je algoritam adaptivnog lokalnog usrednjavanja, koji na osnovu odnosa varijansi šuma i lokalnog susedstva detektuje koji pikseli sadrže šum, i to definiše u matrici težina $\omega(x,y)$. Na osnovu ove matrice piksele uniformnih regiona menja srednjom vrednošću lokalnog susedstva, dok se za piksele koji predstavljaju detalje vrši mnogo manje agresivno otklanjanje šuma, čime se čuvaju detalji.

U sledećem segmentu koda implementiran je metod adaptivnog lokalnog usrednjavanja za uklanjanje šuma sa slike lena_noise.tif. Prikazani su rezultati ovog postupka.

Sa slika iznad vidi se da su dobijeni veoma zadovoljavajući rezultati, sa uklonjenim šumom na uniformnim regionima i delimično očuvanim ivicama. Rezultati nisu savršeni, jer se uz ivice nalazi šum koji nije otklonjen zbog toga što je izabrano veliko lokalno susedstvo, ali bi za manje vrednosti radijusa $r$ šum na uniformnim regionima bio dosta primetniji. Pri izboru $r$ potrebno je balansirati između ova dva problema i napraviti takav izbor da finalni rezultati budu što bolji.

Kao argument za izbor $r=6$ u sledećem delu koda izvršeno je adaptivno lokalno usrednjavanje za vrednosti $r=4$ i $r=8$. Na osnovu poređenja svih rezultata može se dobro videti uticaj radijusa na rezultate i potvrditi doneta odluka o adekvatnom izboru radijusa.

Zadatak 4

U ovom zadatku potrebno je implementirati funkciju dos_median(img_in, s_max, adaptive) koja realizuje postupak adaptivnog ili standardnog medijan filtriranja, u zavisnosti od vrednosti parametara adaptive. Prilikom implementacije nije dozvoljeno koristiti ugrađene funkcije koje pomažu pri realizaciji algoritma.

Brzina izvršavanja algoritma

Uslov da nije dozvoljeno korišćenje ugrađenih funkcija (poput one koja vrši sortiranje niza) ima ogroman uticaj na brzinu izvršavanja ove funkcije. Sve ugrađene funkcije izvršavaju se bez interpretacije jednog po jednog koraka algoritma koji je tom funkcijom implementiran, što mnogostruko ubrzava izvršavanje tog algoritma. Na primer, ugrađena funkcija sort() će uvek raditi brže od samostalno definisane funkcije u Python-u, jer se samostalno definisana funkcija interpretira liniju po liniju, za razliku od ugrađene funkcije koju je dovoljno interpretirati samo jednom.

Takođe, ogroman uticaj na brzinu izvršavanja iz istih razloga ima korišćenje petlji. Korišćenje matričnih izračunavanja je mnogo brže jer se petlja ne interpretira liniju po liniju, kao što je slučaj sa samostalno definisanom petljom.

Pomoćne funkcije

Za definiciju funkcije dos_median prethodno su definisane pomoćne funkcije koje izvršavaju deo algoritma, dok je sama funkcija dos_median definisana kao omotač (wrapper) oko njih.

Sortiranje

S obzirom da vrednosti piksela imaju opseg [0-255] u slučaju uint8 ili [0-1] u slučaju double formata, za sortiranje se može primeniti counting sort algoritam čija je vremenska složenost O(n). Ovaj algoritam definiše se za celobrojne vrednosti niza koji se sortira (jer se one koriste kao indeksi), pa je u slučaju double formata piksela potrebno izvršiti konverziju u uint8 format.

Određivanje medijane

Medijana niza predstavlja vrednost niza za koju važi da je tačno polovina elemenata niza manja ili jednaka njoj, i tačno polovina elemenata niza veća ili jednaka njoj. Medijanu je jednostavno odrediti ukoliko je niz sortiran i poznata njegova dužina, jer je u tom slučaju medijana element čiji je indeks jednak polovini ukupne dužine niza.

Proširenje slike

Filtriranje medijan filtrom realizuje se operacijom konvolucije, koja na izlazu daje sliku sa manjim dimenzijama. Kako bi se ovo izbeglo, potrebno je proširiti sliku tako da se nakon konvolucije dobije slika istih dimenzija kao originalna slika. Sliku je najlakše proširiti nulama, ali se u tom slučaju medijan regiona na krajevima slike pomera ka manjim vrednostima nego što zapravo jeste. Zbog toga je bolje sliku proširiti ponavljanjem onoliko najbližih redova ili kolona slike koliko je potrebno. Dijagonalni elementi ostaju popunjeni nulama, ali se ovako mnogo manje utiče na vrednost medijane regiona.

Takođe, treba naglasiti da je implementacija funkcije dos_median realizovana tako da se proširenje uvek radi tako da do redukcije dimenzija ne dođe u slučaju da se prilikom primene adaptivnog medijan filtriranja koristi najveće lokalno susedstvo. Tada se, u slučaju da manje lokalno susedstvo zadovoljava uslove za primenu adaptivnog medijan filtriranja, vrednosti piksela u proširenju ne poklapaju sa vrednostima piksela na krajevima slike. Međutim, pokazano je da ovakva realizacija ne utiče na rezultat, i da zadovoljava sve zahteve zadatka.

Standardno medijan filtriranje

Standardno medijan filtriranje realizovano je tako što se za svaki piksel slike odredi lokalno susedstvo zadatih dimenzija. Pikseli svakog lokalnog susedstva se sortiraju, i određuje se medijana tog niza. Na kraju, centralni piksel susedstva se zamenjuje medijanom.

Medijan filtriranje je najbolje za otklanjanje impulsnog (salt & pepper) šuma, koga odlikuje iznenadna promena intenziteta piksela na minimalnu ili maksimalnu vrednost. Međutim, činjenice da se koristi fiksna dimenzija susedstva i postupak primenjuje na svaki piksel slike dovodi do neželjenih otklanjanja detalja. Detalji predstavljaju iznenadnu razliku intenziteta piksela, koja se medijan filtriranjem znatno smanjuje. Za očuvanje detalja mnogo je efikasnije koristiti adaptivno medijan filtriranje.

Adaptivno medijan filtriranje

Adaptivno medijan filtriranje otklanja oba uzroka gubitka detalja kod standardnog medijan filtriranja. Za svaki piksel određuju se dimenzije lokalnog susedstva tako što se počevši od najmanjih dimenzija (3x3) ispituje da li je medijan ovog susedstva jednak ekstremnim vrednostima piksela (0 ili 255). Dimenzije se povećavaju sve dok se medijan susedstva ne poklapa ni sa jednom od ovih vrednosti. Dalje, ispituje se da li je centralni piksel posledica impulsnog šuma, tako što se ispituje da li je jednak nekoj od ekstremnih vrednosti piksela. Ukoliko jeste, njegov intenzitet se menja medijanom susedstva. Ovaj postupak ponavlja se za svaki piksel slike, čime se dobija slika sa otklonjenim šumom.

Sledeći deo koda obuhvata definicije gore objašnjenih pomoćnih funkcija, kao i definiciju same funkcije dos_median. Ona obuhvata ispitivanje ulaznih parametara, promenu reprezentacije slike ukoliko je ona potrebna, i primenu odgovarajućeg medijan filtra.

Testiranje funkcije za adaptivno filtriranje

Napisanu funkciju dos_median potrebno je testirati na slikama sa različitim brojem piksela pogođenih impulsnim šumom. Za testiranje je koriščena slika rose.jpg. Potrebno je uporediti rezultate sa rezultatima ugrađene funkcije za medijan filtriranje. Takođe, potrebno je prikazati normalizovano vreme izvršavanja u zavisnosti od veličine prozora.

Za testiranje adaptivnog filtriranja izabrana je maksimalna dimenzija susedstva $s\_max=13$. Rezultati se porede sa ugrađenom funkcijom median paketa filters.

Rezultati pokazuju da je za bilo koju vrednost parametra $p$ funkcija dos_median dala dosta bolje rezultate od ugrađene funkcije, koja vrši standardno medijan filtriranje. Za $p=0.2$ i $p=0.4$ rezultat filtriranja se gotovo u potpunosti poklapa sa originalnom slikom. Za $p=0.6$ impulsni šum je takođe otklonjen, ali u ovom slučaju dolazi do degradacije ivica na slici. Konačno, za $p=0.8$ su i nakon filtriranja ostali vidljivi tragovi impulsnog šuma, i došlo je do dodatne degradacije ivica. Dodatnim povećanjem maksimalne dimenzije prozora $s_max$ ovi tragovi se mogu otkloniti, ali će to imati još nepovoljniji uticaj na ivice.

Iz gore navedenih razloga, vreme izvršavanja funkcije dos_median je mnogo veće od vremena izvršavanja ugrađene funkcije. Ovo bi se moglo poboljšati primenom matričnih operacija, ili izborom drugog programskog jezika (na primer C ili Cython).

Analiza vremena izvršavanja

Poslednji deo zadatka obuhvata analizu uticaja veličine prozora na vreme izvršavanja operacije standardnog medijan filtriranja. Vreme izvršavanja potrebno je normalizovati brojem piksela slike.

U sledećem delu koda izvršene su gore navedene analize i prikazani su rezultati.

Rezultati pokazuju vidljivu zavisnost brzine izvršavanja standardnog medijan filtriranja od veličine prozora. Brzina izvršavanja raste sa porastom dimenzija susedstva, zato što je za svaki piksel potrebno sortirati susedstvo. Iako algoritam counting sort ima vremensku složenost $O(n)$, broj elemenata susedstva raste kvadratno sa porastom parametra $s$. Kao u prethodnim razmatranjima, vreme izvršavanja se može smanjiti korišćenjem matričnih operacija, ugrađenih funkcija, ili izborom bržeg programskog jezika.